package com;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;

public class NativeImageIO {

    static{
        OsInfo osInfo = SystemUtil.getOsInfo();
        if(StringUtils.containsIgnoreCase(osInfo.getName(), "windows")){
            System.load("D:/disk1/libjpeg-9.dll");
            System.load("D:/disk1/libpng-3.dll");
            System.load("D:/disk1/NativeImageIOJNI.dll");
        }else{
            System.out.println("##############dll.dir=/data/workspace/imagelib");
            System.load("/data/workspace/imagelib/libz.so.1.2.8");
            System.load("/data/workspace/imagelib/libz.so.1");
            System.load("/data/workspace/imagelib/libjpeg.so.9");
            System.load("/data/workspace/imagelib/libjpeg.so.9.1.0");
            System.load("/data/workspace/imagelib/libpng12.so.0");
            System.load("/data/workspace/imagelib/libpng12.so.0.51.0");
            System.load("/data/workspace/imagelib/libNativeImageIOJNI.so");
        }
    }

    /**
     * 像素矩阵转图片
     * @param arr 像素矩阵，比特型数组
     * @param height
     * @param width
     * @param dir 文件夹
     * @param fileName 文件名，比如 20200710.png
     * @param ext 后缀名，比如png  jpg
     * @return 成功1，失败0
     */
    public native int write(byte[] arr, int height, int width, String dir, String fileName, String ext);

    /**
     * 像素矩阵转图片,并同时生成缩略图
     * @param arr 像素矩阵，比特型数组
     * @param height
     * @param width
     * @param dir 文件夹
     * @param fileName 文件名，比如 20200710.png
     * @param ext 后缀名，比如png  jpg
     * @param scale 缩略图比例，比如0.1, 缩略图的命名规则：原文件名_small.后缀名
     * @return 成功1，失败0
     */
    public native int writeAndScale(byte[] arr, int height, int width, String dir, String fileName, String ext, double scale);

    public native int write2BGRAndScale(byte[] arr, int height, int width, String dir, String fileName, String ext, double scale);

    /**
     * 根据图片流在本地生成文件，并同时生成缩略图
     * @param arr 图片流
     * @param dir 文件夹
     * @param fileName 文件名，比如 20200710.png
     * @param ext 后缀名，比如png  jpg
     * @param scale 缩略图比例，比如0.1, 缩略图的命名规则：原文件名_small.后缀名
     * @return 成功1，失败0
     */
    public native long memWriteAndScale(byte[] arr, String dir, String fileName, String ext, double scale);

    public static void main(String[] args){
        //load c file

//        System.load("/home/poacfb/imagelib/libjpeg.so.9");
//        System.load("/home/poacfb/imagelib/libjpeg.so.9.1.0");
//        System.load("/home/poacfb/imagelib/libpng12.so.0");
//        System.load("/home/poacfb/imagelib/libpng12.so.0.51.0");
//        System.load("/home/poacfb/imagelib/libNativeImageIOJNI.so");

        System.load("D:/disk1/libjpeg-9.dll");
        System.load("D:/disk1/libpng-3.dll");
        System.load("D:/disk1/NativeImageIOJNI.dll");

//        String s = FileUtil.readUtf8String("C:\\Users\\Administrator\\Desktop\\图片容器部署\\bj_zq_s.txt");
//        final byte[] arr = HexUtil.decodeHex(s);
//
//        NativeImageIO jniDemo = new NativeImageIO();
//        int png = jniDemo.write(arr, 235, 321, "d:/test/", "test" + System.currentTimeMillis() + ".png", "png");

        //*************************************************


//        String s = FileUtil.readUtf8String("C:\\Users\\Administrator\\Desktop\\pa_ue_tgth_0c_apd_0061_001d_oooo_SD00_19730318065323.899.0_19730318065324.022.123_1603983203800_000_2010292251_cg.jpg.txt");
//        final byte[] arr = HexUtil.decodeHex(s);
       //byte[] arr = FileUtil.readBytes("C:\\Users\\Administrator\\Desktop\\微信图片_20201030135542.jpg");

        byte[] arr = FileUtil.readBytes("D:\\pc_workspace\\IMG_9004.jpg");

        NativeImageIO jniDemo = new NativeImageIO();
        long png = jniDemo.memWriteAndScale(arr, "d:/test/", "test" + System.currentTimeMillis() + ".jpg", "jpg", 0.1d);

        //**************************************************

//        for (int j = 0; j < 48 ; j ++) {
//            new Thread(new Runnable() {
//                public void run() {
//                    long l = System.currentTimeMillis();
//                    for (int i = 0; i < 150; i++) {
//                        BufferedImage bufferedImage = new BufferedImage(1024, 500, BufferedImage.TYPE_BYTE_GRAY);
//                        int index = 0;
//                        for (int k = 0; k < 1024; k++) {
//                            for (int m = 0; m < 500; m++) {
//                                bufferedImage.setRGB(k,m,arr[index]);
//                                index ++;
//                            }
//                        }
//                        File file = new File("d://test/t"+System.currentTimeMillis() + ".png");
//                        try {
//                            ImageIO.write(bufferedImage, "png",file);
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                    System.out.println(System.currentTimeMillis() - l);
//                }
//            }).start();
//        }
    }
}
